package org.HU.train.common.controller;

import org.HU.train.common.exception.BusinessException;
import org.HU.train.common.response.CommonResp;
import org.apache.ibatis.jdbc.Null;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @Author ZUZ
 * @Description: 统一异常处理、数据预处理等
 *              这里是针对controller进行拦截，再继续进行异常处理
 *              如果在controller加上限流处理，那么有可能会连接口都进不去，controller自然不会抛出异常，那么自然也不会有这个拦截器对controller的异常进行拦截
 * @Date 2024-12-17 20:23
 * @ClassName: ControllerExceptionHandler
 */
@ControllerAdvice
public class ControllerExceptionHandler {

    private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);

    /**
     * 所有异常统一处理，针对这个Exception不知道是什么异常来处理
     * 只要捕获这个异常，就说明系统有Bug
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public CommonResp<Null> exceptionHandler(Exception e) throws Exception {

        /*LOG.info("seata全局事务ID: {}", RootContext.getXID());
        //如果是在一次全局事务里出异常了，就不要包装返回值，将异常抛给调用方，让调用方回滚事务
        if (StrUtil.isNotBlank(RootContext.getXID())) {
            throw e;
        }*/

        CommonResp<Null> commonResp = new CommonResp<>();
        //打印日志
        LOG.error("系统异常：", e);
        //返回给前端的异常
        commonResp.setSuccess(false);
        commonResp.setMessage("系统出现异常，请联系管理员");
        return commonResp;
    }

    /**
     * 业务异常统一处理
     */
    @ExceptionHandler(value = BusinessException.class)
    @ResponseBody
    public CommonResp<Null> exceptionHandler(BusinessException exception) {
        CommonResp<Null> commonResp = new CommonResp<>();
        LOG.error("业务异常：{}", exception.getBusinessExceptionEnum().getDesc());
        commonResp.setSuccess(false);
        commonResp.setMessage(exception.getBusinessExceptionEnum().getDesc());
        return commonResp;
    }

    /**
     * 校验异常统一处理
     */
    @ExceptionHandler(value = BindException.class)
    @ResponseBody
    public CommonResp<Null> exceptionHandler(BindException e) {
        CommonResp<Null> commonResp = new CommonResp<>();
        LOG.error("校验异常：{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        commonResp.setSuccess(false);
        commonResp.setMessage(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        return commonResp;
    }

    /**
     * 校验异常统一处理
     * @param e
     * @return
     */
    /*@ExceptionHandler(value = RuntimeException.class)
    @ResponseBody
    public CommonResp exceptionHandler(RuntimeException e) {
        throw e;
    }*/

}
